package com.kexun.lxj;

/*使用对象锁解决线程问题*/
public class Demo06 {
    public static void main(String[] args) {
        Runnable r =new Ticket();

        //创建四个线程,卖同一个资源
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);
        Thread t3 = new Thread(r);
        Thread t4= new Thread(r);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

class Ticket implements Runnable {

    private  int i = 100;

    /*创建锁对象    也叫对象锁   也叫同步锁   也叫对象监视器
    * 多个线程使用的锁对象是同一个
    * 锁对象作用:
    *   把同步代码块锁住,只让一个线程在同步代码块中执行*/
       Object obj= new Object();

    @Override
    public  void run() {

        while (true) {

       //     synchronized (Ticket.class) 锁字节码文件也行   因为字节码文件也就一份
            synchronized (obj) {
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (i > 0) {
                    try {
                        System.out.println("这是" + Thread.currentThread().getName() + "卖出的第" + i-- + "张票");
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    System.out.println(Thread.currentThread().getName()+"卖完了,关闭卖票窗口");
                    break;
                }
            }

        }
    }
}